package com.hsm.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.hsm.constant.MessageConstant;
import com.hsm.dao.SetMealDao;
import com.hsm.entity.PageResult;
import com.hsm.pojo.CheckGroup;
import com.hsm.pojo.Setmeal;
import com.hsm.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Transactional
public class SetMealServiceImpl implements SetMealService {

    @Autowired
    private SetMealDao setMealDao;

    /**
     * 新增套餐
     * @return
     */
    @Override
    public void add(Integer[] checkgroupIds, Setmeal setmeal) {
        // 1、将套餐数据添加到t_setmeal表中
        setMealDao.add(setmeal);
        // 2、得到套餐数据的id
        Integer setmealId = setmeal.getId();
        // 3、将套餐id和检查组id插入到关联表中
        setSetMealAndCheckGroup(setmealId,checkgroupIds);
    }

    /**
     * 分页查询套餐数据
     * @return
     */
    @Override
    public PageResult findPage(Integer pageSize, Integer currentPage, String queryString) {
        // 1、进行分页操作
        PageHelper.startPage(currentPage,pageSize);

        // 执行查询语句，返回Page对象
        Page page = setMealDao.findPage(queryString);

        // 3、封装结果到pageResult中进行返回
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());
        return pageResult;
    }

    /**
     * 删除套餐数据
     * @return
     */
    @Override
    public void deleteCheckGroup(Integer setMealId) {

            int count = setMealDao.findById(setMealId);

            // 判断中间表中是否有该数据，如果有关联数据则抛异常，不能删
            if(count > 0){
                throw new RuntimeException(MessageConstant.DELETE_SETMEAL_CHECKGROUP_FAIL);
            }
            setMealDao.deleteById(setMealId);

    }

    /**
     * 根据id查询套餐信息  进行数据回显
     * @param setMealId
     * @return
     */
    @Override
    public Setmeal findSetMealById(Integer setMealId) {
        Setmeal setmeal = setMealDao.findSetMealById(setMealId);
        return setmeal;
    }

    /**
     * 通过检查组的id 查询中间表中有多少检查项，并进行回填打勾
     * @param setMealId
     * @return
     */
    @Override
    public List<Integer> findCheckgroupIdsBySetMealId(Integer setMealId) {

        List<Integer> list = setMealDao.findCheckgroupIdsBySetMealId(setMealId);

        return list;
    }

    /**
     * 修改套餐信息
     */
    @Override
    public void edit(Setmeal setmeal, Integer[] checkgroupIds) {
        // 1、删除中间表中的数据
        setMealDao.deleteAssociation(setmeal.getId());

        // 2、向中间表中插入数据，(建立检查组和检查项的关联)
        setSetMealAndCheckGroup(setmeal.getId(),checkgroupIds);

        // 3、更新检查项信息
        setMealDao.edit(setmeal);

    }

    /**
     * 操作中间表
     * @param setmealId
     * @param checkgroupIds
     */
    private void setSetMealAndCheckGroup(Integer setmealId, Integer[] checkgroupIds) {
        if(checkgroupIds != null && checkgroupIds.length > 0){
            Map map = new HashMap();
            for (Integer checkgroupId : checkgroupIds) {
                map.put("setmealId",setmealId);
                map.put("checkgroupId",checkgroupId);
                setMealDao.setSetMealAndGroup(map);
            }
        }
    }
}
